跳到主要内容

1.4.2 Always块(时钟控制)

针对硬件综合,有两种类型的always块是相关的:

  • 组合逻辑型:always @(*)
  • 时钟控制型:always @(posedge clk)

时钟控制型always块与组合逻辑型always块一样,也会创建一块组合逻辑,但同时还在该组合逻辑块的输出端创建了一组触发器(或称为“寄存器”)。与组合逻辑块的输出立即可见不同,这里的输出只有在下一个时钟上升沿(posedge clk)之后才立即可见。

阻塞与非阻塞赋值

Verilog中有三种类型的赋值:

  • 连续赋值(assign x = y;)。仅能在非过程(即不在"always块"内)中使用。
  • 过程阻塞赋值:(x = y;)。仅能在过程(always块)内使用。
  • 过程非阻塞赋值:(x < = y;)。也仅能在过程(always块)内使用。

在组合逻辑always块中,使用阻塞赋值。在时钟控制always块中,则使用非阻塞赋值。完全理解为什么这样做在硬件设计中并不特别重要,它需要深入理解Verilog仿真器是如何跟踪事件的。不遵循这一规则会导致极其难以发现的错误,这些错误既不确定,又在仿真和综合硬件之间存在差异。

实践练习:

用三种方式构建一个异或门:使用assign语句、组合逻辑always块,以及时钟控制always块。需要注意的是,时钟控制always块产生的电路与其他两种不同:由于存在触发器,所以输出会有延迟。

alt text

模块声明

// synthesis verilog_input_version verilog_2001
module top_module(
input clk,
input a,
input b,
output wire out_assign,
output reg out_always_comb,
output reg out_always_ff );

做题区